/**
 * Copyright (c) 2015-2018 iqiyi
 * All rights reserved.
 *
 * Author     : Wang Haibin
 * E-mail     : wanghaibin@qiyi.com
 * Version    :
 * Date       : Thu 03 Jan 2019 04:21:24 PM CST
 * Destription: 按字节对数据进行混淆算法
 */
#pragma once

class QDataConfusion
{
public:
    QDataConfusion ();
    ~QDataConfusion ();

    /**
     * 对原始数据进行加密
     * @param data 要加密的数据内容
     * @param count 加密数据的长度
     * @param keys 解密key
     * @param keyPos key的位置
     * @return NULL 加密失败，否则返回和count一样长度的加密后的数据
     *      返回的新的数据内容随对象销毁而自动释放空间
     */
    char * Encrypt(const char * data, size_t count,
            const std::string &keys, size_t keyPos);

    /**
     * 对数据进行解密
     * @param data 要解密数据内容
     * @param count 解密的长度
     * @param keys 解密key
     * @param keyPos key的位置
     * @return NULL 解密失败，否则返回和count一样长度的解密后的数据
     */
    char * Decrypt(const char * data, size_t count,
            const std::string &keys, size_t keyPos);

private:
    /**
     * 清理空间
     */
    void Clear();

    /**
     * 创建数据空间
     * @param count 要分配的空间大小
     * @return true 分配成功，false 分配失败
     */
    bool CreateDataSpace(size_t count);

    /**
     * 对数据进行计算
     * @param data 要解密数据内容
     * @param count 解密的长度
     * @param keys 解密key
     * @param keyPos key的位置
     */
    void CalculateData(const char * data, size_t count,
            const std::string &keys, size_t keyPos);
private:
    char * data_;
};
